/*
  ES6模块化前置知识
    无论一个文件被引入多少次,他内部的代码都只会执行一次

*/
// 因为ES6模块化的特点,最终导致,无论多少个组件使用该文件,都只会创建一个callbacks数组
// 整个项目只有这一个callbacks数组
const callbacks = []
let pending = false
let timerFunc;

function flushCallbacks () {
  pending = false

  const copies = callbacks.slice(0)
  callbacks.length = 0
  for (let i = 0; i < copies.length; i++) {
    copies[i]()
  }
}

// 此处正在判断当前环境是否支持Promise
// 如果支持Promise,等下就是用.then微任务实现nextTick
// 如果不支持Promise,就会判断mutationObserver->这是一个HTML5的微任务
// 如果不支持mutationObserver,就会判断setTimeout
if (typeof Promise !== 'undefined') {
  const p = Promise.resolve()
  timerFunc = () => {
    p.then(flushCallbacks)
  }
}


export function nextTick (cb,vm) {
  // 也就是说,Vue会使用callbacks数组,收集开发者传入的所有的回调函数
  callbacks.push(() => {
    if (cb) {
        cb.call(vm)
    }
  })

  // 此处具有开关功能
  // 所以无论执行多少次nextTick,该判断都只能进去一次
  // 无论执行多少次nextTick,都只会开启一个微任务
  if (!pending) {
    pending = true
    timerFunc()
  }
}



// export default mitt();